#pragma once
#include"InetAddr.hpp"
#include"Reactor.hpp"
#include"Logger.hpp"
#include<iostream>
#include<string>
#include<functional>

using callback_t = std::function<std::string (std::string&)>;

class Reactor;//声明

//将连接进行封装 --> 让每一个连接自己带有缓冲区
//文件描述符、客户信息、输入输出缓冲区
//由于连接有两种，此处Connection 可以设计成基类，然后子类继承方法，这样实现在处理就绪事件的时候就不用判断就绪文件描述符的类型
class Connection
{
public:
    Connection():_events(0),_own(nullptr)
    {}
    virtual ~Connection(){}
    //连接需要处理的任务：获取读、写、其他；对于监听套接字来说，读就是获取连接
    virtual void Excepter() = 0;
    virtual void Recver() = 0;
    virtual void Sender() = 0;

    int Sockfd()
    {
        return _sockfd;
    }
    void SetSockfd(int fd)
    {
        _sockfd = fd;
    }
    //关心时间events的Get Set 方法
    uint32_t Events()
    {
        return _events;
    }
    void SetEvents(uint32_t events)
    {
        _events = events;
    }
    void SetAdder(const InetAddr& addr)
    {
        _peer = addr;
    }
    Reactor* Owner()
    {
        return _own;
    }
    void SetOwn(Reactor * own)
    {
        _own = own;
    }
    void SetCallback(callback_t cb)
    {
        _cb = cb;
    }

    //更新最新时间
    void Update()
    {
        //获取当前时间戳
        _lasttimestamp = time(nullptr);
    }
    //Get方法
    uint64_t LastTime()
    {
        return _lasttimestamp;
    }
    //子类会用基类的属性，所以此处成员属性设置为protected
protected:
    int _sockfd;
    uint32_t _events;//关心这个fd 上的什么事件
    std::string _inbuffer;
    std::string _outbuffer;

    InetAddr _peer;
    //在Connection 中增加一个会指向反应堆的指针
    Reactor* _own;
    uint64_t _lasttimestamp;

    callback_t _cb;
};